#define _CRT_SECURE_NO_WARNINGS 1
#include "SList.h"

//void test1()
//{
//	//创建4个节点，并给其数据
//	SLNode* plist1 = (SLNode*)malloc(sizeof(SLNode));
//	plist1->data = 1;
//
//	SLNode* plist2 = (SLNode*)malloc(sizeof(SLNode));
//	plist2->data = 2;
//
//	SLNode* plist3 = (SLNode*)malloc(sizeof(SLNode));
//	plist3->data = 3;
//
//	SLNode* plist4 = (SLNode*)malloc(sizeof(SLNode));
//	plist4->data = 4;
//
//	//将该4个节点连接起来
//	plist1->next = plist2;
//	plist2->next = plist3;
//	plist3->next = plist4;
//	plist4->next = NULL;
//
//	//调用链表打印函数
//	SLPrint(plist1);
//}

void test2()
{
	//测试尾插
	SLNode *plist = NULL;
	SLpushback(&plist, 1);
	//SLPrint(plist);
	SLpushback(&plist, 2);
	//SLPrint(plist);
	SLpushback(&plist, 3);
	//SLPrint(plist);
	SLpushback(&plist, 4);
	SLPrint(plist);//1->2->3->4->NULL

	//测试链表销毁
	SListDesTroy(&plist);
	SLPrint(plist);

	//测试查找
	//SLNode *find = SLTFind(plist,4);
	//if (find == NULL)
	//{
	//	printf("找不到！\n");
	//}
	//else
	//{
	//	printf("找到了！\n");
	//}

	//测试删除pos的下一个节点
/*	SLEraseAfter(find);
	SLPrint(plist)*/;

	//删除pos节点
	//SLErase(&plist,find);//删除中间节点
	//SLPrint(plist);

	//在指定位置之后插入数据
	//SLTnsertAfter(find,99);//在中间节点后添加数据
	//SLPrint(plist);

	//在指定位置之前插入数据
	//SLInsert(&plist,find,10);//在中间节点之前插入10
	//SLPrint(plist);

	//测试头删
	//SLpopfront(&plist);
	//SLPrint(plist);
	//SLpopfront(&plist);
	//SLPrint(plist);
	//SLpopfront(&plist);
	//SLPrint(plist);
	//SLpopfront(&plist);
	//SLPrint(plist);
	//测试头插
	//SLpushfront(&plist,6);
	//SLPrint(plist);
	//SLpushfront(&plist,7);
	//SLPrint(plist);
	//SLpushfront(&plist,8);
	//SLPrint(plist);

	//测试尾删
	//SLpopback(&plist);
	//SLPrint(plist);
	//SLpopback(&plist);
	//SLPrint(plist);
	//SLpopback(&plist);
	//SLPrint(plist);
	//SLpopback(&plist);
	//SLPrint(plist);
}

//SLNode* reverseList(SLNode* head)
//{
//	//如果head为空
//	if (head == NULL)
//	{
//		return NULL;
//	}
//
//	//head不为空
//	//创建新链表
//	SLNode* newphead = NULL;
//	SLNode* newtail = NULL;
//	//遍历旧链表
//	while (head)
//	{
//		if (newphead == NULL)
//		{
//			//如果新链表为空
//			newphead = head;
//			newtail = head;
//		}
//		else
//		{
//			//新链表不为空，进行头插
//			head->next = newphead;
//			newphead = head;
//		}
//		head = head->next;//让head走向下一个节点
//	}
//	//将尾节点的next指针置为空
//	newtail->next = NULL;
//
//	//走到这里说明已经遍历完旧链表，返回新链表的头节点
//	return newphead;
//}

//SLNode* reverseList(SLNode* head)
//{
//	//如果head为空
//	if (head == NULL)
//	{
//		return NULL;
//	}
//
//	SLNode* pcur = head;
//	//head不为空
//	//创建新链表
//	SLNode* newphead = (SLNode*)malloc(sizeof(SLNode));
//	newphead = head;
//	SLNode* newtail = newphead;
//	if (newphead == NULL)
//	{
//		perror("malloc");
//		exit(-1);
//	}
//	while (head)
//	{
//		//头插
//		head->next = newphead;
//		newphead = head;
//		head = head->next;
//	}
//	newtail = NULL;
//	return newphead;
//}

//SLNode* reverseList(SLNode* head)
//{
//	//如果head为空
//	if (head == NULL)
//	{
//		return NULL;
//	}
//
//	//head不为空，进行头插
//	SLNode* newhead = head;
//	SLNode* newtail = head;
//	head = head->next;//从第二个节点开始头插
//	while (head)
//	{
//		SLNode* tmp = head->next;
//		head->next = newhead;
//		newhead = head;
//		head = tmp;
//	}
//	newtail->next = NULL;
//	return newhead;
//}

//
//SLNode* reverseList(SLNode* head)
//{
//	//如果head为空
//	if (head == NULL)
//	{
//		return NULL;
//	}
//
//	//head不为空，进行头插
//	SLNode* newhead = NULL;
//	SLNode* newtail = NULL;
//	while (head)
//	{
//		SLNode* pcur = head->next;
//		if (newhead == NULL)
//		{
//			//新链表为空
//			newhead = head;
//			newtail = head;
//		}
//		else
//		{
//			//链表不为空,头插
//			head->next = newhead;
//			head = newhead;
//		}
//		head = pcur;
//	}
//	//使新链表的尾节点的next指针指向NULL
//	newtail->next = NULL;
//	//走到这里说明已经头插完了
//	return newhead;
//}


SLNode* removeElements(SLNode* head, int val)
{
	//原链表为空，返回NULL
	if (head == NULL)
	{
		return NULL;
	}
	//原链表不为空
	SLNode* pcur = head;
	SLNode* prev = NULL;
	SLNode* pnext = head->next;
	while (pcur)
	{
		//删除该节点
		if (pcur->data == val)
		{
			if (prev == NULL)
			{
				//头删
				head = pnext;
				prev = pnext;
				free(pcur);
				pcur = pnext;
				if (pnext != NULL)
				{
					pnext = pnext->next;
				}
			}
			else
			{
				prev->next = pnext;
				free(pcur);
				pcur = pnext;
				if (pnext != NULL)
				{
					pnext = pnext->next;
				}
			}
		}
		//保存该节点
		else
		{
			prev = pcur;
			pcur = pnext;
			if (pnext != NULL)
			{
				pnext = pnext->next;
			}
		}
	}
	//prev->next = NULL;
	return head;
}
void test3()
{
	//尾插四个节点
	SLNode* plist = NULL;
	SLpushback(&plist, 1);
	SLpushback(&plist, 1);
	SLpushback(&plist, 1);
	SLpushback(&plist, 1);
	SLpushback(&plist, 1);
	SLpushback(&plist, 2);
	SLpushback(&plist, 3);
	SLpushback(&plist, 4);
	SLPrint(plist);//1->2->3->4->NULL
	//一处链表
	SLNode*ret = removeElements(plist,1);
	SLPrint(ret);
}

int main()
{
	//test1();
	//test2();
	test3();//反转链表
	return 0;
}